#utils.fastdfs.py
"""
该模块中需要自定义一个存储后端，来实现获取完整的图片链接
"""
from django.core.files.storage import Storage
from django.conf import settings

from fdfs_client.client import Fdfs_client
from rest_framework import serializers
#自定义文件存储系统，修改存储的方案
class FastDFSStorage(Storage):
    def __init__(self, fdfs_base_url=None):
        """
        构造方法，可以不带参数，也可以携带参数
        :param fdfs_base_url: Storage的ＩＰ
        """
        self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL

    def _open(self, name, mode='rb'):
        #打开本地文件（作用于文件上传）－－项目二使用
        pass

    def _save(self, name, file, max_length=None):
        #保存文件数据（作用于文件上传）--项目二使用
        """
                把文件数据读取出来并调用fdfs客户端接口实现上传图片到fdfs服务器中；
                :param name: 本地文件名 —— 无
                :param file: 浏览器上传的图片数据被django封装成的文件对象
                :param max_length: 限制的文件大小，None指不限制
                :return: 注意：返回值就是存储在mysql中的数据(一定要返回fdfs文件的标识)
        """
        #1、实例化fdfs客户端链接对象
        conn = Fdfs_client(settings.FASTDFS_PATH)
        #2、调用upload_by_buffer上传图片
        content = file.read()
        res = conn.upload_by_buffer(content)
        #判断上传成功与否，并获取文件标识
        if res is not None and res['Status'] == 'Upload successed.':
            return res['Remote file_id']
        else:
            raise serializers.ValidationError('fdfs文件上传失败！')

    def exists(self, name):
        """
        功能：判断文件是否存在
        :param name: 文件名称
        :return: true表示文件存在，false表示文件不存在
        """
        return False





    #该函数的返回值就是：ImageField字段url属性的结果
    def url(self, name):
        #功能，返回图片的链接
        #我们需要重写该函数，构建完整图片链接返回
        #参数：name值ImageField字段在数据库mysql中存储的值，即是id
        #return "http://image.meiduo.site:8888/" + name
        return self.fdfs_base_url + name